package main

import "fmt"

// type calc func(int, int) int // 自定义函数类型

func add(x, y int) int {
	return x + y
}

func sub(x, y int) int {
	return x - y
}

// 自定义一个方法类型 把函数作为参数传入
type calcType func(int, int) int

func calc(x, y int, cb calcType) int {
	return cb(x, y)
}

func do(o string) calcType {
	switch o {
	case "+":
		return add
	case "-":
		return sub
	case "*":
		return func(x, y int) int {
			return x * y
		}
	default:
		return nil
	}
}


func main() {
	// var c calc // 声明变量c为calc类型
	// c = add // 将add赋值给c  只有符合cale类型的函数才能赋值给c
	// fmt.Println(c(10, 5)) // 调用add函数，输出结果为15
	// fmt.Printf("c的类型%T\n", c) // 输出c的类型为c的类型main.calc

	// f := sub
	// fmt.Printf("f的类型%T\n", f) // 输出f的类型为func(int, int) int

	res := calc(10, 5, add) // 调用自定义的calc方法，输出结果为15
	fmt.Println(res) // 输出结果为15

	j := calc(10, 5, func(x, y int) int {
		return x * y
	})
	fmt.Println(j) // 输出结果为50

	var a = do("+")
	fmt.Println(a(10, 5)) // 输出结果为15
}